import {
	computed
} from 'vue'
import {
	decryptData,
	encryptData
} from './encrypt'
import {
	convertLowerUnderlineRecursion,
	convertLowerCamelRecursion
} from './str-util.js'
import {
	getMpEnvSync
} from './common'
import {
	goTo
} from './system.js'
import {
	useUserStore
} from '@/stores/user.js'

const userType = computed(() => {
	return useUserStore().userType ?? '2'
})

let baseUrl = 'https://platformpay.zzzfj.com'
let isEncrypt = true
let urlObj = {
	// dev: 'https://platformpay.zzzfj.com',
	// 佳堃
	// dev: 'http://192.168.110.90:57002',
	// 森保
	dev: 'http://192.168.110.24:57002',
	// 高峰亭
	// dev: 'http://192.168.110.22:57002',
	// 林祖宇
	// dev: 'http://192.168.110.19:57002',
	// 泰圣
	// dev: 'http://192.168.110.63:57002',
	// 泽平
	// dev: 'http://192.168.110.5:57002',
	// 龙威
	// dev: 'http://192.168.110.64:57002',
	// dev: 'http://172.17.40.202:57002', //内网生产测试
	trial: 'https://platformpay.zzzfj.com', //体验版
	release: 'https://platformpay.zzzfj.com', //正式版
}
// 小程序设置接口路径
const mpSetUrl = (env) => {
	if (env === 'develop') {
		console.log('当前是开发版');
		isEncrypt = false
		baseUrl = urlObj.dev
	} else if (env === 'trial') {
		console.log('当前是体验版');
		baseUrl = urlObj.trial
	} else if (env === 'release') {
		console.log('当前是正式版');
		baseUrl = urlObj.release
	} else {
		console.log('当前环境未知');
	}
}
// #ifdef H5
if (process.env.NODE_ENV === 'development') {
	console.log('开发环境');
	isEncrypt = false
	baseUrl = urlObj.dev
} else {
	console.log('生产环境');
	baseUrl = urlObj.release //公网生产测试
}
// #endif
// #ifdef MP-WEIXIN || MP-ALIPAY
const env = getMpEnvSync();
mpSetUrl(env)
console.log('请求路径==>', baseUrl);
// #endif

export const request = (options, isEncryptMy) => {
	isEncryptMy = isEncryptMy ?? isEncrypt
	// 请求拦截器：可以在这里统一设置请求头、处理请求数据等
	options.header = {
		...options.header,
		'Content-Type': 'application/json', // 示例：统一设置请求头
		'Authorization': useUserStore().token ? `Bearer ${useUserStore().token}` : '', // 示例：从本地存储中获取token并设置
		'User_Type': userType.value ? userType.value : '2',
		'Oper_Device_Type': '1',
		'Oper_Type': '1',
	}

	//请求拦截器，驼峰转下划线
	options.data = convertLowerUnderlineRecursion(options.data)
	//请求拦截器，数据加密处理
	options.data = {
		data: isEncryptMy ? encryptData(options.data) : options.data
	}

	let url = ''
	if (options.url.indexOf('http') == 0) {
		url = options.url
	} else {
		url = baseUrl + options.url
	}

	// 统一显示加载框
	// uni.showLoading({
	// 	title: '加载中...',
	// 	mask: true
	// })

	return new Promise((resolve, reject) => {
		uni.request({
			method: 'POST',
			...options,
			url,
			success: (res) => {
				// 响应拦截器：可以根据返回的状态码做不同的处理
				if (res.data.code === 200) {
					let data
					try {
						const resData = isEncryptMy ? JSON.parse(decryptData(res.data
							.data)) : res.data.data
						data = convertLowerCamelRecursion(resData);
					} catch (error) {
						console.error(error);
						data = res.data.data
						//TODO handle the exception
					}
					res.data.data = data
					console.log('res', res.data);
					resolve(res.data)
				} else {
					// 错误处理
					console.error('请求失败', res)
					uni.showToast({
						title: res.data.msg || '请求失败!',
						icon: 'error',
						duration: 2000
					});
					if (res.data.code === 401) {
						goTo('/pages/login/index', {}, {
							method: 'reLaunch'
						})
					}
					resolve(res)
				}
			},
			fail: (err) => {
				// 请求失败时的处理
				console.error('请求错误', err)
				uni.$emit('z-paging-error-emit');
				reject(err)
			},
			complete: () => {
				// 隐藏加载框
				// uni.hideLoading()
			}
		})
	})
}


const MAX_RETRY_TIMES = 5; // 最大重试次数

/**
 * 封装带重试机制的请求方法
 * @param {string} options 请求配置
 * @param {number} retryCount 当前重试次数
 * @returns {Promise}
 */
export function retryableRequest(options, retryCount = 0) {
	return new Promise((resolve, reject) => {
		request(options).then((res) => {
			// 成功则 resolve
			if (res.code >= 200 && res.code < 300) {
				resolve(res);
			} else {
				// 状态码异常，视为失败，进行重试
				if (retryCount < MAX_RETRY_TIMES) {
					console.log(`请求失败，正在重试第 ${retryCount + 1} 次...`);
					setTimeout(() => {
						retryableRequest(options, retryCount + 1).then(resolve)
							.catch(reject);
					}, 1000); // 延迟 1s 重试
				} else {
					reject({
						error: '请求失败，已达最大重试次数',
						options,
					});
				}
			}
		}).catch((err) => {
			// 网络错误，也进行重试
			if (retryCount < MAX_RETRY_TIMES) {
				console.log(`请求失败，正在重试第 ${retryCount + 1} 次:`, err);
				setTimeout(() => {
					retryableRequest(options, retryCount + 1).then(resolve).catch(
						reject);
				}, 1000);
			} else {
				reject({
					error: '网络请求失败，已达最大重试次数',
					options,
					err
				});
			}
		})
	});
}